/**
 * Project: c:\work\PWS_Projects\03_PWS_Lib\pws-formula
 * Created Date: Wednesday, August 22nd 2018, 12:01:16 pm
 * Author: Thomas.li
 * -----
 * Last Modified:
 * Modified By:
 * -----
 * Copyright (c) 2018 pareact
 * ------------------------------------
 * Javascript will save your soul!
 */

// let buf = Buffer.from(
//   '51032400000000000E4A440003073200000000000E4A44000000000003073200030732001418D77D62',
//   'hex'
// );
let buf = Buffer.from(
  '65034008E70F43021A1383006DFC80FFF5007A08D20F2A01ED13830063FC84FFFE006F08B60F5002091383006AFC67FFFF007308CE0F3D020413',
  'hex'
);

/**
 * get the float value from 4 byte buffer
 * @param {number} start
 */
function hp(start) {
  if (start < 0 || start > buf.length - 4) {
    throw new RangeError('Out of the range');
  }
  let result = [...Array(4).keys()].map(i =>
    buf[start + i].toString(2).padStart(8, '0')
  );
  result = result.join('');
  let reg = /^[0-1]*$/;
  if (!reg.test(result)) throw new TypeError('The value is invalid');
  let mark = result[0] == '1' ? -1 : 1;
  let eMark = parseInt(result.slice(1, 9), 2);
  let mMark = parseInt(result.slice(9), 2);
  let r1 = 2 ** (eMark - 127);
  let r2 = mark * r1 * mMark * 2 ** -23;
  return Math.round((r1 + r2) * 100) / 100;
}

/**
 * get the Hex value of DEC
 * @param {number} start
 * @param {number} [length=2]
 * @returns
 */
function hx(start, length = 2) {
  if (length > 4 || length < 0) {
    throw new RangeError('Out of Index Range');
  }
  return buf.readIntBE(start, length);
}

// console.log(hp(3));
// console.log(hp(7));
// console.log(hp(11));
// console.log(hp(15));
// console.log(hp(19));
// console.log(hp(23));
// console.log(hp(27));
// console.log(hp(31));
// console.log(hp(35));
// console.log(hp(39));
// console.log(hp(43));
// console.log(hp(47));

console.log(hx(11));
